//
//  main.m
//  03-集合
//
//  Created by 402030900@qq.com on 16/7/6.
//  Copyright © 2016年 402030900@qq.com. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    // 1.数组
    // 1> 数组:可变数组 NSMutableArray 与 不可变数组 NSArray
    // 数组主要是有序的存放元素的集合类型,并且可以通过下标取值.
    
    // 注意:数组中只能存放对象类型
    
    // 不可变数组 只能取值
    // 可变数组 可以进行增、删、改的操作
    
    //不可变数组
        // 2> 初始化数组
    // <1> 初始化方法 initWithObjects 后面填入的参数一定是对象类型
    //     可变参数 C语言中的链表(后续讲)
    //     顺序填入你需要的元素
    // 初始化结束以nil为判别标准
    NSArray * array = [[NSArray alloc]initWithObjects:@"123",@"234",@"345",@"456", nil];
    NSLog(@"array = %@",array);
    // <2> 构造器方法
    NSArray * arr = [NSArray arrayWithObjects:@"123",@"234",@"345",@"456", nil];
    NSLog(@"arr = %@",arr);
    // <3> 字面量 同 NSString @"" NSNumber @()
    //     NSArray @[]
    //     三种初始化方式,推荐使用字面量
    //     字面量可以识别,对象为空值;但一般的初始化方法不可以
    //      如果为空,字面量会崩溃  -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert  nil object from objects[1]'
    //     但是,初始化方法会识别nil为结束,并不会产生问题,造成数据丢失
//    NSString * obj = nil;
//    NSArray * myArray = @[@"123",obj,@"234",@"345",@"456"];
//    NSLog(@"myArray = %@",myArray);
    
    // 3> 取值相关
    // <1> count 取得数组中元素的个数
    NSLog(@"%ld",arr.count);
    // <2> 数组中取值,通过下标去取值
    NSString * numberString = [arr objectAtIndex:0];
    // <3> 语法糖 取值方式 快捷取值
    arr[0];
    // <4> 根据值取对应的下标
   NSUInteger indexOfObject = [arr indexOfObject:@"123"];
    NSLog(@"%ld",indexOfObject);
    // <5> 判断对象是否存在于数组中
    BOOL isHaveObject = [arr containsObject:@"123"];
    NSLog(@"%@",isHaveObject ? @"YES" : @"NO");
    // <6> 取数组中第0位的元素 / 取数组中最后一个元素(如果数组为空,返回的对象为空,并且不会崩溃)
    [arr firstObject];
    [arr lastObject];
    
    // 4> 不可变数组,改变元素(会生成新的数组,不会在原数组基础上修改)\
    //    1> 数组添加一个新的元素
    arr = [arr arrayByAddingObject:@"234"];
    NSLog(@"arr = %@",arr);
    //    2> 数组添加另外一个数组中的所有元素
    [arr arrayByAddingObjectsFromArray:array];
    NSLog(@"arr = %@",arr);
    
    //可变数组
//    NSMutableArray
    // 1> 初始化方法 同 不可变数组
    //遇到可变数组,只能使用初始化方法或者便利构造器
    NSMutableArray * mutableArray = [NSMutableArray array];
    //字面量创建方法,不推荐大家使用
//    NSMutableArray * mutableArray = [@[]mutableCopy];
    // 2> 取值方式 与 不可变数组 一样
    // 3> 可变数组改变元素
    //  <1> 数组中添加元素 addObject
    [mutableArray addObject:@"123"];
    //  <2> 数组中插入元素
    [mutableArray insertObject:@"含蓄" atIndex:0];
    //  <3> 移除 第0个元素
    [mutableArray removeObjectAtIndex:0];
//    //  移除最后一个元素
//    [mutableArray removeLastObject];
//    //  移除全部
//    [mutableArray removeAllObjects];
    //  <4>替换(使用替换时,数组对应位置不能为空)
    [mutableArray replaceObjectAtIndex:0 withObject:@"韩旭"];
    NSLog(@"mutableArray = %@",mutableArray);
    
    // 可变 与 ,@""不可变的区别
    // 1.可变是可以修改的,但不可变不可以
    // 2.不可变调用改变的方法时,会生成对象;可变调用改变方法时,在对象本身上进行修改
    // 3.可变 继承于 不可变
    // 将字符串根据子串,截取成数组
    // 根据哪个子串截取,哪个字串就会消失
    NSString * urlString = @"www.a123cb.com";
    NSArray* urlArray = [urlString componentsSeparatedByString:@"."];
    NSLog(@"%@",urlArray);
    
    //根据某个字符串,把数组拼接成一个字符串
    NSArray * nameArray = @[@"韩旭",@"隔壁",@"老黄"];
    NSString * nameString = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"%@",nameString);
    
    
    return 0;
}
